home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 1 / Gold Medal Software Volume 1 (Gold Medal) (1994).iso / prog / tpwprog7.arj / SERVER.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-07-02  |  5.1 KB  |  190 lines

  1. { server.pas -- Simple (cold link) DDE server }
  2.  
  3. program Server;
  4.  
  5. {$R server.res}
  6.  
  7. uses WinTypes, WinProcs, WObjects, Strings, StdDlgs;
  8.  
  9. const
  10.  
  11.   id_Menu      = 100;    { Menu resource ID }
  12.   cm_EnterData = 101;    { Enter data command ID }
  13.   cm_ClearData = 102;    { Clear data command ID }
  14.   cm_Quit      = 103;    { Exit command ID }
  15.   maxDataLen   = 64;     { Maximum length of data string }
  16.  
  17.   serverName = 'Server';  { Name of server application }
  18.   serverTopic = 'Data';   { Name of data to be transferred }
  19.  
  20. type
  21.  
  22.   ServerApplication = object(TApplication)
  23.     procedure InitMainWindow; virtual;
  24.   end;
  25.  
  26.   PServerWindow = ^ServerWindow;
  27.   ServerWindow = object(TWindow)
  28.     Data: array[0 .. maxDataLen] of Char;
  29.     constructor Init(AParent: PWindowsObject; ATitle: PChar);
  30.     procedure Paint(PaintDC: HDC;
  31.       var PaintInfo: TPaintStruct); virtual;
  32.     procedure WMDDEInitiate(var Msg: TMessage);
  33.       virtual wm_First + wm_DDE_Initiate;
  34.     procedure WMDDETerminate(var Msg: TMessage);
  35.       virtual wm_First + wm_DDE_Terminate;
  36.     procedure WMDDERequest(var Msg: TMessage);
  37.       virtual wm_First + wm_DDE_Request;
  38.     procedure CMEnterData(var Msg: TMessage);
  39.       virtual cm_First + cm_EnterData;
  40.     procedure CMClearData(var Msg: TMessage);
  41.       virtual cm_First + cm_ClearData;
  42.     procedure CMQuit(var Msg: TMessage);
  43.       virtual cm_First + cm_Quit;
  44.   end;
  45.  
  46.  
  47. { ServerApplication }
  48.  
  49. {- Initialize ServerApplication object's window }
  50. procedure ServerApplication.InitMainWindow;
  51. begin
  52.   MainWindow := New(PServerWindow, Init(nil, serverName))
  53. end;
  54.  
  55.  
  56. { ServerWindow }
  57.  
  58. {- Construct ServerWindow object }
  59. constructor ServerWindow.Init(AParent: PWindowsObject; ATitle: PChar);
  60. begin
  61.   TWindow.Init(AParent, ATitle);
  62.   with Attr do
  63.   begin
  64.     Menu := LoadMenu(HInstance, PChar(id_Menu));
  65.     X := 300; Y := 10; W := 275; H := 300
  66.   end;
  67.   Data[0] := #0
  68. end;
  69.  
  70. {- Respond to wm_DDE_Initiate request from client }
  71. procedure ServerWindow.WMDDEInitiate(var Msg: TMessage);
  72. var
  73.   appAtom, appTopic: TAtom;
  74. begin
  75.   appAtom := GlobalAddAtom(serverName);
  76.   appTopic := GlobalAddAtom(serverTopic);
  77.   if SendMessage(
  78.     Msg.WParam,   { Client's window handle }
  79.     wm_DDE_Ack,   { Acknowledge receipt of initiate request }
  80.     HWindow,      { Server's window handle }
  81.     MakeLong(appAtom, appTopic  { Global atoms }
  82.   )) = 0 then
  83.   begin
  84.     GlobalDeleteAtom(appAtom);
  85.     GlobalDeleteAtom(appTopic)
  86.   end
  87. end;
  88.  
  89. {- Respond to wm_DDE_Terminate message }
  90. procedure ServerWindow.WMDDETerminate(var Msg: TMessage);
  91. begin
  92.   PostMessage(Msg.WParam, wm_DDE_Terminate, HWindow, 0)
  93. end;
  94.  
  95. {- Respond to a client's request for data }
  96. procedure ServerWindow.WMDDERequest(var Msg: TMessage);
  97. var
  98.   HData: THandle;     { Handle to data's memory block }
  99.   PData: PDDEData;    { Pointer to data }
  100.   AppTopic: TAtom;    { Global atom identifies topic }
  101.   DataError: Boolean; { General purpose error flag }
  102. begin
  103.  
  104.   AppTopic := HiWord(Msg.LParam);
  105.   {- Inspect or copy AppTopic here if necessary }
  106.   DataError := (StrLen(Data) = 0) or (LoWord(Msg.LParam) <> cf_Text);
  107.  
  108.   {- Prepare data for transmission }
  109.   if not DataError then
  110.   begin
  111.     HData := GlobalAlloc(gmem_Moveable or gmem_DDEShare,
  112.       Sizeof(TDDEData) + StrLen(Data) + 1);
  113.     if HData <> 0 then
  114.     begin
  115.       PData := GlobalLock(HData);
  116.       if PData = nil then
  117.       begin
  118.         GlobalFree(HData);
  119.         DataError := true
  120.       end else
  121.       begin
  122.         PData^.Flags := dde_Release;  { Client must release data }
  123.         PData^.CfFormat := cf_Text;
  124.         Move(Data, PData^.Value, StrLen(Data) + 1);
  125.         GlobalUnlock(HData)
  126.       end
  127.     end
  128.   end;
  129.  
  130.   {- Transmit error or data }
  131.   if DataError then
  132.     PostMessage(Msg.WParam, wm_DDE_Ack, HWindow,
  133.       MakeLong(0, AppTopic))  { Post negative acknowledgement }
  134.   else
  135.     if not PostMessage(Msg.WParam, wm_DDE_Data, HWindow,
  136.       MakeLong(HData, AppTopic)) then
  137.     begin
  138.       GlobalFree(HData);
  139.       GlobalDeleteAtom(AppTopic)
  140.     end
  141.  
  142. end;
  143.  
  144. {- Enter new server data, sent on request to a client }
  145. procedure ServerWindow.CMEnterData(var Msg: TMessage);
  146. begin
  147.   Application^.ExecDialog(New(PInputDialog,
  148.     Init(@Self, 'Input Server Data', 'Enter a line of text: ',
  149.     Data, Sizeof(Data))));
  150.   InvalidateRect(HWindow, nil, true)
  151. end;
  152.  
  153. {- Erase current data }
  154. procedure ServerWindow.CMClearData(var Msg: TMessage);
  155. begin
  156.   Data[0] := #0;
  157.   InvalidateRect(HWindow, nil, true)
  158. end;
  159.  
  160. {- Exit application }
  161. procedure ServerWindow.CMQuit(var Msg: TMessage);
  162. begin
  163.   CloseWindow
  164. end;
  165.  
  166. {- Display current data in window }
  167. procedure ServerWindow.Paint(PaintDC: HDC;
  168.   var PaintInfo: TPaintStruct);
  169. begin
  170.   TWindow.Paint(PaintDC, PaintInfo);
  171.   if StrLen(Data) > 0 then
  172.     TextOut(PaintDC, 10, 100, Data, StrLen(Data))
  173. end;
  174.  
  175. var
  176.  
  177.   ServerApp: ServerApplication;
  178.  
  179. begin
  180.   ServerApp.Init('ServerApp');
  181.   ServerApp.Run;
  182.   ServerApp.Done
  183. end.
  184.  
  185.  
  186. {--------------------------------------------------------------
  187.   Copyright (c) 1991 by Tom Swan. All rights reserved.
  188.   Revision 1.00    Date: 5/27/1991
  189. ---------------------------------------------------------------}
  190.